﻿// 10004  智力大冲浪.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>

using namespace std;
/*
https://loj.ac/p/10004

题目描述
小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者，主持人为了表彰大家的勇气，先奖励每个参赛者 m 元。
先不要太高兴！因为这些钱还不一定都是你的？！接下来主持人宣布了比赛规则：

首先，比赛时间分为 n 个时段，它又给出了很多小游戏，每个小游戏都必须在规定期限 t_i 前完成。
如果一个游戏没能在规定期限前完成，则要从奖励费 m 元中扣去一部分钱 w_i，w_i 为自然数，不同的游戏扣去的钱是不一样的。
当然，每个游戏本身都很简单，保证每个参赛者都能在一个时段内完成，而且都必须从整时段开始。
主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者，小伟很想赢得冠军，当然更想赢取最多的钱！
注意：比赛绝对不会让参赛者赔钱！

输入格式
输入共四行。

第一行为 m，表示一开始奖励给每位参赛者的钱；

第二行为 n，表示有 n 个小游戏；

第三行有 n 个数，分别表示游戏 1 到 n 的规定完成期限；

第四行有 n 个数，分别表示游戏 1 到 n 不能在规定期限前完成的扣款数。

输出格式
输出仅一行，表示小伟能赢取最多的钱。

样例
10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10


9950

数据范围与提示
对于 100\% 的数据，有 n <= 500,1 <= t_i <= n。
*/

const int N = 510;
struct SEG {
	int t, cost;
}segs[N];
int used[N];
int m, n;

bool cmp(const struct SEG& a, const struct SEG& b) {
	return a.cost > b.cost;
}

int main()
{
	cin >> m >> n;

	for (int i = 1; i <= n; i++) {
		cin >> segs[i].t;
	}
	for (int i = 1; i <= n; i++) {
		cin >> segs[i].cost;
	}
	sort(segs+1,segs+1+n,cmp);

	for (int i = 1; i <= n; i++) {
		int t = segs[i].t; int cost = segs[i].cost;
		int find = 0;
		for (int j = t; j > 0; j--) {
			if (used[j] == 0) {
				used[j] = 1; find = 1; break;
			}
		}
		if (find == 0) {
			m -= cost;
		}
	}
	cout << m << endl;

	return 0;
}

 